package com.copyctrl.campus.portal.util;

import cn.hutool.json.JSONUtil;
import com.copyctrl.campus.common.domain.ScrollResult;
import org.springframework.data.redis.connection.RedisZSetCommands;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * @author:JH
 * @version:1.0
 */
public class RedisUtil {
    /**
     *
     * @param redisTemplate 静态方法不能使用成员变量，所以传进来一个
     * @param key 此分页用于动态和文章，提取出来可以多次调用
     * @param max 上一次查询的最小时间
     * @param offset 偏移量（下标）
     * @param count 查出多少数据
     * @param exchange 转换的数据类型
     * @return
     *     从redis中取数据（分页，zset）
     */
    public static <T> ScrollResult getDataByPage(StringRedisTemplate redisTemplate,
                                                 String key,
                                                 Long max,
                                                 int offset,
                                                 int count,
                                                 Class<T> exchange){
        Set<ZSetOperations.TypedTuple<String>> typedTuples = redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, 0, max, offset, count);
        if(typedTuples==null||typedTuples.size()==0){
            return new ScrollResult();}
        // 解析set，取出redis中存储的数据的List,同时计算下一次的max和offset
        List<T> list=new ArrayList<>(typedTuples.size());
        long minTime=0;
        int num=1;
        for(ZSetOperations.TypedTuple<String> typedTuple:typedTuples) {
            list.add(JSONUtil.toBean(typedTuple.getValue(),exchange));
            if (minTime == typedTuple.getScore()) {
                num++;
            } else {
                minTime = typedTuple.getScore().longValue();
                num = 1;
            }
        }
        ScrollResult<T> result = new ScrollResult<>();
        result.setList(list);
        result.setMinTime(minTime);
        result.setOffset(num);
        return result;
    }


    /**
     * 获取动态
     * @param redisTemplate
     * @param key
     * @param max
     * @param offset
     * @param count
     * @return
     */
    public static  ScrollResult getDynamicByPage(StringRedisTemplate redisTemplate,
                                                 String key,
                                                 Long max,
                                                 int offset,
                                                 int count
                                                 ){
        Set<ZSetOperations.TypedTuple<String>> typedTuples = redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, 0, max, offset, count);
        if(typedTuples==null||typedTuples.size()==0){
            return new ScrollResult();}
        // 解析set，取出redis中存储的数据的List,同时计算下一次的max和offset
        List list=new ArrayList<>(typedTuples.size());
        long minTime=0;
        int num=1;
        for(ZSetOperations.TypedTuple<String> typedTuple:typedTuples) {
            list.add(typedTuple.getValue());
            if (minTime == typedTuple.getScore()) {
                num++;
            } else {
                minTime = typedTuple.getScore().longValue();
                num = 1;
            }
        }
        ScrollResult result = new ScrollResult<>();
        result.setList(list);
        result.setMinTime(minTime);
        result.setOffset(num);
        return result;
    }
}
